/*****************************************************************************
*
*  PROJECT:		
*               
*  LICENSE:		
*
*  DEVELOPER:	
*
*****************************************************************************/

#include "EonModel.h"

//////////////////////////////////////////////////////////
//					MD5 Model Methods					//
//////////////////////////////////////////////////////////

void Eon::Model::modelMD5::init( Eon::Vector3 modelPosition, Eon::Vector3 modelRotation, GLfloat modelScale, const char *modelFileName )
{
	Eon::Model::modelMD5::modelPosition = modelPosition;
	Eon::Model::modelMD5::modelRotation = modelRotation;
	Eon::Model::modelMD5::modelScale = modelScale;
	theModel = new MD5Model();
	theModel->loadMesh( modelFileName );
}

void Eon::Model::modelMD5::moveModel( GLfloat modelXPosition, GLfloat modelYPosition, GLfloat modelZPosition )
{
	modelPosition.setX( modelXPosition );
	modelPosition.setY( modelYPosition );
	modelPosition.setZ( modelZPosition );
}

void Eon::Model::modelMD5::moveModel( Eon::Vector3 modelPosition )
{
	Eon::Model::modelMD5::modelPosition.setX( modelPosition.getX() );
	Eon::Model::modelMD5::modelPosition.setY( modelPosition.getY() );
	Eon::Model::modelMD5::modelPosition.setZ( modelPosition.getZ() );
}

void Eon::Model::modelMD5::rotateModel( GLfloat modelXRotation, GLfloat modelYRotation, GLfloat modelZRotation )
{
	modelRotation.setX( modelRotation.getX() );
	modelRotation.setY( modelRotation.getY() );
	modelRotation.setZ( modelRotation.getZ() );
}

void Eon::Model::modelMD5::rotateModel( Eon::Vector3 modelRotation )
{
	Eon::Model::modelMD5::modelRotation.setX( modelRotation.getX() );
	Eon::Model::modelMD5::modelRotation.setY( modelRotation.getY() );
	Eon::Model::modelMD5::modelRotation.setZ( modelRotation.getZ() );
}

void Eon::Model::modelMD5::renderModel( void )
{
	glPushMatrix();
		glTranslatef( modelPosition.getX(), modelPosition.getY(), modelPosition.getZ() );
		glRotatef( modelRotation.getX(), 1.0f, 0.0f, 0.0f );
		glRotatef( modelRotation.getY(), 0.0f, 1.0f, 0.0f );
		glRotatef( modelRotation.getZ(), 0.0f, 0.0f, 1.0f );
		glScalef( modelScale, modelScale, modelScale );
		glEnable( GL_TEXTURE_2D );
		theModel->render();
		glDisable( GL_TEXTURE_2D );
	glPopMatrix();
}

Eon::Vector3 Eon::Model::modelMD5::getPosition( void )
{
	return modelPosition;
}

Eon::Vector3 Eon::Model::modelMD5::getRotation( void )
{
	return modelRotation;
}

GLfloat Eon::Model::modelMD5::getScale( void )
{
	return modelScale;
}

//////////////////////////////////////////////////////////
//					3DS Model Methods					//
//////////////////////////////////////////////////////////

void Eon::Model::model3DS::init( Eon::Vector3 modelPosition, Eon::Vector3 modelRotation, GLfloat modelScale, const char *modelFileName )
{
	Eon::Model::model3DS::modelPosition = modelPosition;
	Eon::Model::model3DS::modelRotation = modelRotation;
	Eon::Model::model3DS::modelScale = modelScale;
	theModel = new L3DS( modelFileName );
}

void Eon::Model::model3DS::moveModel( GLfloat modelXPosition, GLfloat modelYPosition, GLfloat modelZPosition )
{
	modelPosition.setX( modelXPosition );
	modelPosition.setY( modelYPosition );
	modelPosition.setZ( modelZPosition );
}

void Eon::Model::model3DS::moveModel( Eon::Vector3 modelPosition )
{
	Eon::Model::model3DS::modelPosition.setX( modelPosition.getX() );
	Eon::Model::model3DS::modelPosition.setY( modelPosition.getY() );
	Eon::Model::model3DS::modelPosition.setZ( modelPosition.getZ() );
}

void Eon::Model::model3DS::rotateModel( GLfloat modelXRotation, GLfloat modelYRotation, GLfloat modelZRotation )
{
	modelRotation.setX( modelRotation.getX() );
	modelRotation.setY( modelRotation.getY() );
	modelRotation.setZ( modelRotation.getZ() );
}

void Eon::Model::model3DS::rotateModel( Eon::Vector3 modelRotation )
{
	Eon::Model::model3DS::modelRotation.setX( modelRotation.getX() );
	Eon::Model::model3DS::modelRotation.setY( modelRotation.getY() );
	Eon::Model::model3DS::modelRotation.setZ( modelRotation.getZ() );
}

void Eon::Model::model3DS::renderModel( void )
{	
	glEnableClientState( GL_VERTEX_ARRAY );	// Enable before drawing 3ds model
	glEnableClientState( GL_NORMAL_ARRAY );	// Enable before drawing 3ds model

	glPushMatrix();
		glTranslatef( modelPosition.getX(), modelPosition.getY(), modelPosition.getZ() );
		glRotatef( modelRotation.getX(), 1.0f, 0.0f, 0.0f );
		glRotatef( modelRotation.getY(), 0.0f, 1.0f, 0.0f );
		glRotatef( modelRotation.getZ(), 0.0f, 0.0f, 1.0f );
		glScalef( modelScale, modelScale, modelScale );
		glEnable( GL_TEXTURE_2D );
		GLuint meshes = theModel->GetMeshCount();
		for ( GLuint mesh = 0; mesh < meshes; mesh++ )
		{
			LMesh &lMesh = theModel->GetMesh( mesh );
			glVertexPointer( 4, GL_FLOAT, 0, &lMesh.GetVertex( 0 ) );
			glNormalPointer( GL_FLOAT, 0, &lMesh.GetNormal( 0 ) );
			glDrawElements( GL_TRIANGLES, lMesh.GetTriangleCount()*3, GL_UNSIGNED_SHORT, &lMesh.GetTriangle( 0 ) );
		}
		glDisable( GL_TEXTURE_2D );
	glPopMatrix();

	glDisableClientState( GL_VERTEX_ARRAY );
	glDisableClientState( GL_NORMAL_ARRAY );
}

Eon::Vector3 Eon::Model::model3DS::getPosition( void )
{
	return modelPosition;
}

Eon::Vector3 Eon::Model::model3DS::getRotation( void )
{
	return modelRotation;
}

GLfloat Eon::Model::model3DS::getScale( void )
{
	return modelScale;
}